<?php
/*
 * * * * * * * * * * LICENCIA * * * * * * * * * * * * * * * * * * * * *

Copyright(C) 2012
Instituto Universtiario de Tecnología Dr. Federico Rivero Palacio

Este programa es Software Libre y usted puede redistribuirlo y/o modificarlo
bajo los términos de la versión 3.0 de la Licencia Pública General (GPLv3)
publicada por la Free Software Foundation (FSF), es distribuido sin ninguna
garantía. Usted debe haber recibido una copia de la GPLv3 junto con este
programa, sino, puede encontrarlo en la página web de la FSF, 
específicamente en la dirección http://www.gnu.org/licenses/gpl-3.0.html

 * * * * * * * * * * ARCHIVO * * * * * * * * * * * * * * * * * * * * *

Nombre: DocenteServicio.clase.php
Diseñador: Daniel Abreu (dabreuperes@gmail.com)
Programador: Daniel Abreu
Fecha: Noviembre de 2012
Descripción: 

	Esta clase ofrece el servicio de conexión a la base de datos, recibe 
	los parámetros, construye las consultas SQL, hace las peticiones a 
	la base de datos y retorna los objetos o datos correspondientes a la
	acción.

 * * * * * * * * Cambios/Mejoras/Correcciones/Revisiones * * * * * * * *
Diseñador - Programador /   Fecha   / Descripción del cambio
---                         ----      ---------

 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/?>
<?php

class DocenteServicio {
	/*Metodo que permite obtener todos los docentes que esten inscritos 
	 * en un pemsum:
	 * parametros de entrada:
	 * -$codigo: es el codigo de el pensun
	 * Parametros de salida
	 * 	en caso de exito un arrelo de docentes pertenecientes a ese 
	 * pensum
	 * En caso de Error 
	 * FALSE*/
	static public function obtenerDocentesPemsum($codigo) {
		//construir sql
		
		$sql = "SELECT 
					ts_persona.nombre1, 
					ts_persona.nombre2, 
					ts_persona.apellido1, 
					ts_persona.apellido2, 
					ts_persona.sexo, 
					ts_persona.tip_sangre, 
					ts_persona.fec_nacimiento, 
					ts_persona.cod_instituto, 
					ts_persona.cod_pensum, 
					ts_persona.rif, 
					ts_persona.codigo as cod_persona, 
					ts_persona.cedula, 
					ts_persona.telefono1, 
					ts_persona.telefono2, 
					ts_persona.cor_personal, 
					ts_persona.cor_institucional, 
					ts_persona.direccion, 
					ts_docente.login, 
					ts_docente.passwd,
					ts_docente.codigo as cod_docente, 
					ts_docente.num_empleado
				FROM 
					public.ts_pensum, 
					public.ts_persona, 
					public.ts_docente
				WHERE 
					ts_pensum.codigo = ts_persona.cod_pensum AND
					ts_docente.codigo = ts_persona.codigo AND 
					ts_pensum.codigo = $codigo;";

		//1. conexión a base de datos...
		global $gbConectorPostgre;
		
		$gbConectorPostgre->conectar();
		$result = $gbConectorPostgre->ejecutarSelect($sql);
		$gbConectorPostgre->desconectar();

		//3. procesar resultado
		if (($result === false) or ($result === 0))
			return $result;
		else{
			return DocenteServicio::cargarObjetoDocente($result);
		}
	}
	/*Permite buscar un docente en específico.
	  Parámetros de entrada:
	    $codigo: código del docente a buscar
	  Valores de retorno:
	    arreglo cuya única posición (la 0) es el objeto docente
	    0: Valor numérico 0 en caso de no existir coincidencia
	    false: valor lógico false en caso de ocurrir algún error
	*/
	static public function obtenerDocentePorCodigo($codigo) {
		//construir sql
		
		$sql = "SELECT 
					  ts_persona.cedula, 
					  ts_persona.codigo as cod_persona, 
					  ts_persona.rif, 
					  ts_persona.cod_instituto, 
					  ts_persona.nombre1, 
					  ts_persona.cod_pensum, 
					  ts_persona.nombre2, 
					  ts_persona.apellido1, 
					  ts_persona.apellido2, 
					  ts_persona.sexo, 
					  ts_persona.fec_nacimiento, 
					  ts_persona.tip_sangre, 
					  ts_persona.telefono1, 
					  ts_persona.telefono2, 
					  ts_persona.cor_personal, 
					  ts_persona.cor_institucional, 
					  ts_persona.direccion, 
					  ts_docente.estado,
					  ts_docente.passwd,
					  ts_est_docente.descripcion,
					  ts_docente.codigo as cod_docente, 
					  ts_docente.num_empleado, 
					  ts_docente.login,
					  ts_persona.privilegio

					FROM 
					  public.ts_persona, 
					  public.ts_docente,
					  public.ts_est_docente
					WHERE 
					  ts_persona.codigo = ts_docente.codigo AND
					  ts_docente.estado = ts_est_docente.estado AND 
  						ts_persona.codigo = $codigo";

		//conexión a base de datos...
		global $gbConectorPostgre;
		
		$gbConectorPostgre->conectar();
		$result = $gbConectorPostgre->ejecutarSelect($sql);
		$gbConectorPostgre->desconectar();
		//procesar resultado
		if (($result === false) or ($result === 0))
			return $result;
		else{
			return DocenteServicio::cargarObjetoDocente($result);
		}
	}
	/*Permite buscar un docente en específico.
	  Parámetros de entrada:
	    $cedula: cedula del docente a buscar
	  Valores de retorno:
	    arreglo cuya única posición (la 0) es el objeto docente
	    0: Valor numérico 0 en caso de no existir coincidencia
	    false: valor lógico false en caso de ocurrir algún error
	*/
	static public function obtenerDocentePorCedula($cedula) {
		//construir sql
		
		$sql = "SELECT 
					  ts_persona.cedula, 
					  ts_persona.codigo as cod_persona, 
					  ts_persona.rif, 
					  ts_persona.cod_instituto, 
					  ts_persona.nombre1, 
					  ts_persona.cod_pensum, 
					  ts_persona.nombre2, 
					  ts_persona.apellido1, 
					  ts_persona.apellido2, 
					  ts_persona.sexo, 
					  ts_persona.fec_nacimiento, 
					  ts_persona.tip_sangre, 
					  ts_persona.telefono1, 
					  ts_persona.telefono2, 
					  ts_persona.cor_personal, 
					  ts_persona.cor_institucional, 
					  ts_persona.direccion, 
					  ts_docente.estado,
					  ts_docente.passwd,
					  ts_est_docente.descripcion,
					  ts_docente.codigo as cod_docente, 
					  ts_docente.num_empleado, 
					  ts_docente.login,
					  ts_persona.privilegio
					FROM 
					  public.ts_persona, 
					  public.ts_docente,
					  public.ts_est_docente
					WHERE 
					  ts_persona.codigo = ts_docente.codigo AND
					  ts_docente.estado = ts_est_docente.estado AND
  						ts_persona.cedula = '$cedula'";

		//conexión a base de datos...
		global $gbConectorPostgre;
		
		$gbConectorPostgre->conectar();
		$result = $gbConectorPostgre->ejecutarSelect($sql);
		$gbConectorPostgre->desconectar();

		//procesar resultado
		if (($result === false) or ($result === 0))
			return $result;
		else{
			return DocenteServicio::cargarObjetoDocente($result);
		}
	}
	
/*Método genérico que permite hacer consultas complejas.
	  Parámetros de entrada:
	    $campos: campos a consultar de la base de datos (opcional)
	    $where: condición where de la consulta (opcional)
	    $orderby: clausula order by de la consulta SQL (opcional)
	    $parametros: arreglo con los parámetros de la consulta (opcional)
	  Valores de retorno:
	    un arreglo de objetos tipo Docente
	    0: valor numérico 0 en caso de no existir coincidencias
	    false: valor lógico false si ocurre algún error.
	*/

	static public function obtenerDocentes($campos="*", $where=null, $orderBy=null, $parametros=null)
	{
		//instrucción para reconocer el objeto conexión
		global $gbConectorPostgre;
		//construcción de la consulta SQL
		$sql = "select $campos from public.ts_persona, 
							 				 public.ts_docente, 
  											 public.ts_instituto, 
  											 public.ts_pensum"
			. (($where!=null)? " where $where":"")
			. (($orderBy!=null)? " order by $orderBy":"")
			. ";";
			
		//conectarse a la base de datos	
		$gbConectorPostgre->conectar();  
		
		//ejecutar el select, con los parámetros correspondientes	
		$result = $gbConectorPostgre->ejecutarSelect($sql,$parametros);

		// desconectarse de la base de datos
		$gbConectorPostgre->desconectar(); 
		if (($result === FALSE) or ( $result === 0) )
			//retorna false si ocurre un error, y 0 si la consulta no
			//devuelve filas
			return $result;
		else {
			return DocenteServicio::cargarObjetoDocente($result);
			}
			
		}
		
/*Permite buscar varios Docentes según un patrón de búsqueda, buscará
	  cualquier coincidencia en mayúscula y/o minúscula en cualquier parte
	  del nombre1, nombre2, cedula, rif, apellido1, apellido2 ,numero de empleado, y direccion. 
	  Parámetros de entrada:
	    $patron: patrón a buscar en los diferentes campos
	  Valores de retorno:
	    un arreglo de objetos tipo Docente
	    0: valor numérico 0 en caso de no existir coincidencias
	    false: valor lógico false si ocurre algún error.
	*/
	static public function obtenerListaDocentes($patron){
		$patron = "%" . $patron . "%";
		$where = " (ts_docente.codigo = ts_persona.codigo AND
 					  ts_instituto.codigo = ts_persona.cod_instituto AND
  					  ts_pensum.codigo = ts_persona.cod_pensum) AND (
					  cast(ts_persona.rif as varchar(10)) like $1 OR				  
  					  upper(ts_persona.nombre1) like upper($1) OR
  					  upper(ts_persona.nombre2) like upper($1) OR   
  					  upper(ts_persona.apellido1) like upper($1) OR
					  upper(ts_persona.apellido2) like upper($1) OR
					  cast(ts_persona.cedula as varchar(10)) like $1 OR
					  cast(ts_docente.num_empleado as varchar(10)) like $1 OR
					  upper(ts_persona.direccion) like upper($1))";
		//Tipo de Orden
		return DocenteServicio::obtenerDocentes("  	  ts_persona.codigo as cod_persona, 
													  ts_persona.rif, 
													  ts_persona.cod_instituto, 
													  ts_persona.cod_pensum, 
													  ts_persona.nombre1, 
													  ts_persona.nombre2, 
													  ts_persona.apellido2, 
													  ts_persona.apellido1, 
													  ts_persona.sexo, 
													  ts_persona.privilegio,
													  ts_persona.fec_nacimiento, 
													  ts_persona.tip_sangre, 
													  ts_persona.telefono2, 
													  ts_persona.telefono1, 
													  ts_persona.cor_personal, 
													  ts_persona.cor_institucional, 
													  ts_persona.direccion,  
													  ts_docente.num_empleado, 
													  ts_docente.passwd,
													  ts_docente.login,
													  ts_docente.estado,  
													  ts_pensum.nombre, 
													  ts_pensum.nom_corto, 
													  ts_pensum.observaciones, 
													  ts_docente.codigo as cod_docente, 
													  ts_pensum.codigo as cod_per, 
													  ts_instituto.codigo as cod_istituto, 
													  ts_instituto.nom_corto, 
													  ts_instituto.nombre, 
													  ts_instituto.direccion, 
													  ts_persona.cedula", $where, "apellido1 asc",array($patron));
	}
	

	/*Permite modificar un docente en la base de datos, 
	   Parámetros de entrada:
	     $docente: objeto tipo Docente, la modificación se le hará
	        al Docente que tenga el mismo código de este objeto
	   Valor de retorno:
	     true: en caso de éxito
	     false: en caso de error 
	*/	
	static public function modificarDocente($docente){
		//reconocer gbConectorPostgre
		global $gbConectorPostgre;
			
				
		
		
		 $existe = DocenteServicio::obtenerDocentePorCedula($docente->obtenerCedula());
		  
		 if(is_object($existe[0]) && $docente->obtenerCodigo() == $existe[0]->obtenerCodigo()){ 
			//construir sql de la tabla persona
			$sql = "update ts_persona set cedula=$1, rif=$2, cod_instituto=$3,
			cod_pensum=$4,nombre1=upper($5),nombre2=upper($6), apellido1=upper($7),  apellido2=upper($8),sexo=$9,
			fec_nacimiento=$10,tip_sangre=$11,telefono1=$12,telefono2=$13, cor_personal=$14,
			direccion=$15, cor_institucional=$16 , privilegio=$18  where codigo = $17;";	
							
			//parametros de la consulta
			$parametros = array($docente->obtenerCedula(),               //1
								$docente->obtenerRif(),					//2
								$docente->obtenerCodInstituto(),		//3
								$docente->obtenerCodPensum(),				//4
								$docente->obtenerNombre1(),	//5	
								$docente->obtenerNombre2(),//6
								$docente->obtenerApellido1(),//7
								$docente->obtenerApellido2(),//8
								$docente->obtenerSexo(),//9
								$docente->obtenerFecNacimiento(),//10
								$docente->obtenerTipSangre(),//11
								$docente->obtenerTelefono1(),//12
								$docente->obtenerTelefono2(),//13
								$docente->obtenerCorreoPersonal(),//14
								$docente->obtenerDireccion(),//15
								$docente->obtenerCorreoInstitucional(),//16	
								$docente->obtenerCodigo(),	     //17
								$docente->obtenerPrivilegio()		     //18
								
							);

			//construir sql de la tabla docente
			$sql2 = "update ts_docente set num_empleado=$1, login=$2 , estado=$4 where codigo=$3;";
			//parametros de la consulta
			$parametros2 = array($docente->obtenerNumEmpleado(),
								 $docente->obtenerLogin(),
								 $docente->obtenerCodDocente(),   
								 $docente->obtenerEstado(), 
								);				
			
			//conexión, ejecución y desconexión
			$gbConectorPostgre->conectar();
			$result = $gbConectorPostgre->ejecutarUpdate($sql,$parametros);
			
			$result2 = $gbConectorPostgre->ejecutarUpdate($sql2,$parametros2);
			$gbConectorPostgre->desconectar();
			
			//evaluar resultado
			if ((($result === FALSE) or ( $result === 0)) and (($result2 === FALSE) or ( $result2 === 0)) )
				return false; 
			else 
				return true;
		}else{
			return 1; 
			}
	
			
	}
		/*Permite eliminar un Docente de la base de datos, 
	   Parámetros de entrada:
	     $codigo: codigo del docente a eliminar
	   Valor de retorno:
	     true: en caso de éxito
	     false: en caso de error 
	*/	
	static public function eliminarDocente($codigo){
		//reconocer gbConectorPostgre
		global $gbConectorPostgre;
		
				$sql="SELECT * FROM ts_persona WHERE privilegio='A'";
		
		$gbConectorPostgre->conectar();
		$result = $gbConectorPostgre->ejecutarSelect($sql);
		$gbConectorPostgre->desconectar();
		if(count($result) >= 1 and $result[0]['codigo'] !=$codigo){
			//construir sql de la tabla docente
			$sql = "delete from ts_docente 
					 where  cast(codigo as varchar(10)) = $1;";
			//construir sql de la tabla persona         
			$sql2 = "delete from ts_persona 
					 where  cast(codigo as varchar(10)) = $1;"; 
			//parametros de la consulta                        
			$parametros = array($codigo);
			
			//conexión, ejecución y desconexión
		    $gbConectorPostgre->conectar();
			@$result = $gbConectorPostgre->ejecutarDelete($sql,$parametros);
			@$result = $gbConectorPostgre->ejecutarDelete($sql2,$parametros);
			$gbConectorPostgre->desconectar();

			if (($result === FALSE) or ( $result === 0) )
				return false; 
			else 
				return true;
		}else{
			return 1; 
			}
	}
		/*Permite obtener las unidades curriculares de cada curso, 
	   Parámetros de entrada:
	     $curso: es un arreglo de objetos tipo curso
	   Valor de retorno:
	     $unidadCurrricular: un arreglo co el nombre de las unidades 
	     Currriculares
	*/	
	static public function obtenerUnidadesCurriculares($curso){
		//reconocer gbConectorPostgre
		global $gbConectorPostgre;
		//construir sql
		$sql = "select nombre from ts_uni_curricular where cast(codigo as varchar(10)) like $1";
		//conexión, ejecución y desconexión
		$gbConectorPostgre->conectar();
		for($i=0;$i < count($curso);$i++){
		$parametros= array($curso[$i]->obtenerCodUniCurricular());
		$result = $gbConectorPostgre->ejecutarSelect($sql,$parametros);
		$unidadCurrricular[$i]=$result[0];
		}
		$gbConectorPostgre->desconectar();
		//retornar $unidadCurrricular
		return $unidadCurrricular;

		}
	
	/*Permite agregar un Docente a la base de datos, 
	   Parámetros de entrada:
	     $docente: objeto tipo Docente,
	   Valor de retorno:
	     true: en caso de éxito
	     false: en caso de error 
	*/
	static public function agregarDocente($docente){
		//reconocer gbConectorPostgre
		global $gbConectorPostgre;
		 $existe = DocenteServicio::obtenerDocentePorCedula($docente->obtenerCedula());

		 if(is_object($existe[0]) != true ){ 
				 
			//consulta sql de la tabla persona
			$sql = "insert into ts_persona values ($1,(select coalesce(max(codigo), 0) + 1 from ts_persona),$2,$3,$4,upper($5),upper($6),upper($7),upper($8),$9,$10,$11,$12,$13,$14,$15,$16);";					
			
			//parametros de la consulta
			$parametros = array($docente->obtenerCedula(),
								$docente->obtenerRif(),
								$docente->obtenercodInstituto(),
								$docente->obtenerCodPensum(),				
								$docente->obtenerNombre1(),
								$docente->obtenerNombre2(),
								$docente->obtenerApellido1(),
								$docente->obtenerApellido2(),
								$docente->obtenerSexo(),
								$docente->obtenerFecNacimiento(),
								$docente->obtenerTipSangre(),
								$docente->obtenerTelefono1(),
								$docente->obtenerTelefono2(),
								$docente->obtenerCorreoPersonal(),
								$docente->obtenerCorreoInstitucional(),
								$docente->obtenerDireccion(),	
											 
							);
			//consulta sql de la tabla docencen
			$sql2 = "insert into ts_docente (codigo,num_empleado,login,estado,passwd) 
				values ((select max(codigo) from ts_persona),$1, $2,$3,md5(reverse(cast($4 as varchar))));";	
			//parametros de la consulta
			$parametros2 = array($docente->obtenerNumEmpleado(),
								 $docente->obtenerCedula(),
								 $docente->obtenerEstado(),    
								 $docente->obtenerCedula()
								 );
							
			//conexión, ejecución y desconexión de la base de datos				
			$gbConectorPostgre->conectar();
			$result = $gbConectorPostgre->ejecutarInsert($sql,$parametros);
			$result = $gbConectorPostgre->ejecutarInsert($sql2,$parametros2);
			$gbConectorPostgre->desconectar();
			
			//evaluar el resultado
			if (($result === FALSE) or ( $result === 0) )
				return false;
			else 
			return true;
		}else{
			return 1; 
			}	
		
	}
	static public function cambioDeRol($codNA,$codAA){
		//reconocer gbConectorPostgre
		global $gbConectorPostgre;
		$d = DocenteServicio::obtenerDocentePorCodigo($codAA);
	
		$sql1 = "update ts_persona set privilegio= 'A'  where cast(codigo as varchar) = $1;";
		$sql2 = "update ts_persona set privilegio= 'D'  where cast(codigo as varchar) = $1;";
		$sql3 = "update ts_persona set privilegio= 'B'  where cast(codigo as varchar) = $1;";	

		$gbConectorPostgre->conectar();

		if($d[0]->obtenerPrivilegio() == 'A'){
			$result = $gbConectorPostgre->ejecutarUpdate($sql1,array($codNA));
			$result2 = $gbConectorPostgre->ejecutarUpdate($sql3,array($codAA));
		}elseif($d[0]->obtenerPrivilegio() == 'D'){
			$result = $gbConectorPostgre->ejecutarUpdate($sql2,array($codNA));
			$result2 = $gbConectorPostgre->ejecutarUpdate($sql3,array($codAA));
			}
		$gbConectorPostgre->desconectar();
	
			//evaluar resultado
			if ((($result === FALSE) or ( $result === 0)) and (($result2 === FALSE) or ( $result2 === 0)) )
				return false; 
			else 
				return true;
	
			
	}
	
	static public function modificarContraseñaDocente($docente){
		//reconocer gbConectorPostgre
		global $gbConectorPostgre;

		
		$sql = "update ts_docente set passwd= md5($1)  where codigo = $2;";	
		$parametros = array($docente->obtenerContraseña(),
							$docente->obtenerCodigo()	     
							);
			
		$gbConectorPostgre->conectar();
		$result = $gbConectorPostgre->ejecutarUpdate($sql,$parametros);
		$gbConectorPostgre->desconectar();
		
			//evaluar resultado
			if (($result === FALSE) or ( $result === 0))
				return false; 
			else 
				return true;
	
			
	}
	
	
	
	/*Permite crear un objeto tipo Docente con los datos que genera la 
	 * consulta, 
	   Parámetros de entrada:
	     $result: datos que provienen de la consurta,
	   Valor de retorno:
	     $d : arreglo de objetos tipo docente 
	*/
	static public function cargarObjetoDocente($result){
	for ($i = 0 ; $i < count($result); $i++){
			$d[$i] = new Docente();
			
			$d[$i]->asignarCedula(   			$result[$i]['cedula'] 				);
			$d[$i]->asignarCodigo(   			$result[$i]['cod_persona'] 			);
			$d[$i]->asignarCodDocente(   		$result[$i]['cod_docente'] 			);
			$d[$i]->asignarNumEmpleado( 		$result[$i]['num_empleado']			);
			$d[$i]->asignarNombre1(				$result[$i]['nombre1']				);
			$d[$i]->asignarNombre2(				$result[$i]['nombre2']				);
			$d[$i]->asignarApellido1(     	    $result[$i]['apellido1']			);
			$d[$i]->asignarApellido2( 			$result[$i]['apellido2']			);
			$d[$i]->asignarSexo(				$result[$i]['sexo']					);
			$d[$i]->asignarRif(					$result[$i]['rif']					);
			$d[$i]->asignarFecNacimiento( 		$result[$i]['fec_nacimiento']		);
			$d[$i]->asignarTipSangre(   		$result[$i]['tip_sangre']			);
			$d[$i]->asignarTelefono1(			$result[$i]['telefono1']			);
			$d[$i]->asignarTelefono2(			$result[$i]['telefono2']			);
			$d[$i]->asignarCorreoPersonal(		$result[$i]['cor_personal']			);
			$d[$i]->asignarCorreoInstitucional(	$result[$i]['cor_institucional']	);
			$d[$i]->asignarDireccion(			$result[$i]['direccion']			);
			$d[$i]->asignarCodPensum(			$result[$i]['cod_pensum']			);
			$d[$i]->asignarcodInstituto(		$result[$i]['cod_instituto']		);
			$d[$i]->asignarLogin(				$result[$i]['login']				);
		@	$d[$i]->asignarEstado(				$result[$i]['estado']				);
		@	$d[$i]->asignarestDescricion(		$result[$i]['descripcion']			);
			$d[$i]->asignarContraseña(			$result[$i]['passwd']				);
		@	$d[$i]->asignarPrivilegio(			$result[$i]['privilegio']			);
		    list($a,$m,$d1) = explode("-",$d[$i]->obtenerFecNacimiento());
            $d[$i]->asignarFecNacimiento( $d1.'-'.$m.'-'.$a			);
            
            
		
		}
		return $d;
		
		}
		
}

?>
